package com.yunban.project.api.text_check.service;

import com.yunban.project.api.text_check.domain.CorrectionConfig;
import com.yunban.project.api.text_check.service.CorrectionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Arrays;
import java.util.List;

/**
 * @author: lijiajun
 * @date: 2024-11-20
 * @version: 1.0
 */
public interface AiCorrectionService extends CorrectionService {

    /**
     * 提取两个标记之间的文本
     *
     * @param input       输入字符串
     * @param startMarker 开始标记
     * @param endMarker   结束标记
     * @return 提取的文本
     */
    default String extractBetween(String input, String startMarker, String endMarker) {
        int startIndex = input.indexOf(startMarker) + startMarker.length();
        int endIndex = input.indexOf(endMarker);
        if (startIndex < 0 || endIndex < 0 || startIndex >= endIndex) {
            // 或者抛出异常，根据需求决定
            return "";
        }
        return input.substring(startIndex, endIndex).trim();
    }

    /**
     * 提取某个标记之后的所有文本
     *
     * @param input  输入字符串
     * @param marker 标记
     * @return 提取的文本
     */
    default String extractAfter(String input, String marker) {
        int startIndex = input.indexOf(marker) + marker.length();
        if (startIndex < 0) {
            // 或者抛出异常，根据需求决定
            return "";
        }
        return input.substring(startIndex).trim();
    }

    // 格式化返回
    default String formatResponse(String response, String sourceText) {
        // 输出：你好呀！分类：固定用法来源：无特定来源，基于常用语言习惯修改说明：将“你号呀”纠正为常用的问候语“你好呀”。
        // 分别取出 纠错后的文本（你好呀！）、分类（固定用法）、来源（无特定来源，基于常用语言习惯修改说明：将“你号呀”纠正为常用的问候语“你好呀”。）
        // 获取输出结果
        // 取出 输出：和 分类：之间的文本
        // 提取“输出：”和“分类：”之间的文本
        // 去除掉 response 中所有的 <br/> \n \\n
        response = response.replaceAll("<br/>", "");
        response = response.replaceAll("\\n", "");
        response = response.replaceAll("\\\\n", "");

        // 判断response 是否包含 输出：
        if (!response.contains("输出：")) {
            response = "输出：" + response;
        }
        String correctedText = extractBetween(response, "输出：", "分类：");
        // 提取“分类：”和“来源：”之间的文本
        String category = extractBetween(response, "分类：", "错误等级：");
        String level = extractBetween(response, "错误等级：", "来源：");

        if (!StringUtils.hasText(level) || "无".equals(level) || "0级别".equals(level)) {
            level = "三级";
        }
        List<String> levels = Arrays.asList("一级", "二级", "三级");
        if (!levels.contains(level)) {
            level = "三级";
        }
        // 提取“来源：”之后的文本
        String source = extractAfter(response, "来源：");
        // 判断来源中前缀中是否是 源文本中的前缀，这样就代表这个纠错结果是错的
        // 截取 sourceText length - 1 的长度
        String sourceTextV2 = sourceText.substring(0, sourceText.length() - 1);
        if (source.startsWith(sourceTextV2)) {
//            source = source.replace(sourceText, "");
            correctedText = sourceText;
        }
        if (correctedText.equals(sourceText + "<br/>")) {
            // 假如纠错后只是多了一个<br/>，那么就直接源文本，不需要进行解析了
            correctedText = sourceText;
        }
        return correctedText + "----" + category + "----" + level + "----" + source;
    }
}